import { RequestMethod } from "../lib/defines";
import { MemberBase, RoomBase } from "../utils/types";

export type LeaveQuery = {
  // 所属用户
  member: MemberBase;
  // 所属房间
  room: RoomBase;
}

export default function leaveClassroom (app) {
  const { socket, rooms } = app.locals;
  const { userId } = socket.handshake.query;
  /**
   * 离开房间
   *
   * 1. 会议
   *    自身离开:
   *      销毁输出:
   *        销毁自身 pipeline;
   *        销毁自身所有输出的 endpoint;
   *      销毁监听:
   *        销毁房间其他所有人向自己输出的 endpoint;
   *    关闭他人视频:
   *      销毁监听:
   *        销毁指定用户向自己输出的 endpoint;
   * 2. 广播
   *    主持人:
   *      同会议: 自身离开 -> 销毁输出;
   *    观众:
   *      同会议: 关闭他人视频 -> 销毁输出;
   *
   */
  socket.on(RequestMethod.leave, function leave ({ room, member }: LeaveQuery, cb) {
    const __room = rooms[room.classId]

    if (__room) {
      const { creator } = __room

      room = Object.assign(room, __room.json())
      /**
       * 2秒 等待接听时间
       */
      socket.broadcast
        .timeout(500)
        .to(room.classId)
        .emit('left', { room, member } as any, function (error: any) {
          if (member.userId === creator.userId && member.userId === userId) {
            /**
             * 自身离开
             * 销毁自身 pipeline & 所有 endpoint
             */
            __room.members[userId].stop()

            /**
             * 关闭其他人对自己的输出
             */
            __room.getMembers().forEach(member => {
              member.stop(userId)
            })
          } else {
            /**
             * 关闭了其他人的画面
             * 即：其他人身上自己的节点
             */
            __room.members[member.userId].stop(userId)
          }

          // 回调
          if (cb) {
            cb({ status: 'ok', resolve: 'dissolved' })
          }
        });
    } else {
      console.error('room is not find!')
    }
  });
}
